Cteni pole bytu z ActiveX componenty

Otázka od: j.binder@albacon.cz

17. 8. 2004 13:45

Ahoj,
nemuzu se %subj pohnout, tak to jeste jednou a naposled zkousim.
Kdyby byl nekdo ochoten se na to podivat, rad mu vynalozenou namahu ZAPLATIM
- komponentu mohu zaslat, vlastni kod se tyka temer doslova par radku (v
takovem pripade se mi ozvete na soukromy email, pripadny vysledek bych sem pak
sdelil).

Dotaz byl:

Mam ActiveX komponentu, ktera mi vraci pole bytu. V importovanem rozhrani je v
prislusna metoda deklarovana jako XXX(var ReceivedData: OleVariant)

Zkousel jsem zhruba toto
var v: OleVariant;
  v := VarArrayCreate([0,76], varByte), resp.
v := VarArrayRef( VarArrayCreate([0,76], varByte))
....
XXX(v)

Zcela zjevne vsak metoda dostane neco jineho nez ceka, protoze misto dat se mi
vraci chyby jako Acces violation, external exception, privilegid instruction,
safe array locked ....

V chodicim prikladu HTML/VBScriptu je toto volani
dim ReceiveData(76)
ActiveXCtrl.XXX(ReceiveData(0))

v dokumentaci je uvedena hlavicka
XXX(VARIANT* ReceiveData)

Uz na tom visim dlouho a nevim co s tim. Chyba asi bude u mne, ale nemuze byt
tez nejaka nekompatibilita mezi COM objekty vytvorenymi ve VC++ a kodem
generovanym Delphi? Za kazdou pomoc predem moc dekuji.

   Zdravi Jiri Binder


Odpovedá: Petr Zahradnik

13. 8. 2004 22:38

Puvodni zprava ze dne 13.8.2004:

> dim ReceiveData(76)
> ActiveXCtrl.XXX(ReceiveData(0))

> v dokumentaci je uvedena hlavicka
> XXX(VARIANT* ReceiveData)

Treba toto jsou zkousel?

var S: String;

SetLength(S, 76);
XXX(S[1]);

nebo misto posledniho radku:
XXX(@S[1]);

Petr Zahradnik, pocitacovy expert

==========================================================
Petr Zahradnik, Computer Laboratory
Obvodova 740/14, 400 07 Usti nad Labem
telefon: 475 501 627, mobil: 602 409 601, fax: 475 511 338
web: http://www.clexpert.cz, e-mail: clexpert@clexpert.cz
ICQ: 21215917, MSN: clexpert@clexpert.cz
==========================================================



Odpovedá: j.binder@albacon.cz

14. 8. 2

> Treba toto jsou zkousel?
>
> var S: String;
>
> SetLength(S, 76);
> XXX(S[1]);
>
> nebo misto posledniho radku:
> XXX(@S[1]);
>
> Petr Zahradnik, pocitacovy expert

Ten parametr je volany odkazem a je OleVariant, takze snad jedine lze
v: OleVariant;
....
v := S
XXX(v)

Takto jsem to zkousel, neproslo.
Tez mam porad pocit ze to chce ukazatel na to pole misto vararray, ale kdyz
jsem zkusil rucne upravit xxxTLB.pas a podstrcit tam typ PSafeArray, tak jsem
dostal chybu Ilegal type in OLE automation section a skoncil jsem.

Jiri Binder


Odpovedá: Petr Zahradnik

14. 8. 2004 0:18

Puvodni zprava ze dne 14.8.2004:

> Ten parametr je volany odkazem a je OleVariant, takze snad jedine lze

Kdyby byl odkazem, tak by se podle me nedimenzoval, to bude tutove
nejake pole, mozna tam cpe unicode, zkusil jsi ho jeste zvetsit?

Petr Zahradnik, pocitacovy expert

==========================================================
Petr Zahradnik, Computer Laboratory
Obvodova 740/14, 400 07 Usti nad Labem
telefon: 475 501 627, mobil: 602 409 601, fax: 475 511 338
web: http://www.clexpert.cz, e-mail: clexpert@clexpert.cz
ICQ: 21215917, MSN: clexpert@clexpert.cz
==========================================================